package com.haohan.jingyuan.customer.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.haohan.jingyuan.customer.entity.CustomerIncome;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 客户收入Mapper接口
 * 
 * @ClassName CustomerIncomeMapper
 * @Description 客户收入数据访问层
 * @Author hexijun
 * @Time 2025/01/19 16:00
 * @Version 1.0
 */
@Mapper
public interface CustomerIncomeMapper extends BaseMapper<CustomerIncome> {

    /**
     * 根据收入记录ID查询收入信息
     * 
     * @param id 收入记录ID
     * @return 收入信息
     */
    CustomerIncome findById(@Param("id") Long id);

    /**
     * 根据客户ID查询收入列表（按时间倒序）
     * 
     * @param customerId 客户ID
     * @return 收入列表
     */
    List<CustomerIncome> selectByCustomerId(@Param("customerId") String customerId);

    /**
     * 分页查询客户收入列表
     * 
     * @param page 分页对象
     * @param incomeType 收入类型（可空）
     * @param customerId 客户ID（可空）
     * @param incomeDateStart 收入日期开始（可空）
     * @param incomeDateEnd 收入日期结束（可空）
     * @return 分页收入列表
     */
    IPage<CustomerIncome> selectIncomeListPage(Page<CustomerIncome> page,
                                               @Param("incomeType") String incomeType,
                                               @Param("customerId") String customerId,
                                               @Param("incomeDateStart") java.util.Date incomeDateStart,
                                               @Param("incomeDateEnd") java.util.Date incomeDateEnd);

    /**
     * 统计指定收入类型的收入记录数量
     * 
     * @param incomeType 收入类型
     * @return 数量
     */
    int countByIncomeType(@Param("incomeType") String incomeType);

    /**
     * 统计总实收金额
     *
     * @return 总实收金额
     */
    java.math.BigDecimal sumTotalReceivedAmount();

    /**
     * 根据收入类型分组统计应收收入金额（按日期范围）
     *
     * @param incomeDateStart 收入日期开始
     * @param incomeDateEnd 收入日期结束
     * @return 分组统计结果列表，包含 incomeType 和 totalAmount
     */
    List<java.util.Map<String, Object>> groupByIncomeType(@Param("incomeDateStart") java.util.Date incomeDateStart,
                                                          @Param("incomeDateEnd") java.util.Date incomeDateEnd);

    /**
     * 根据客户ID分组统计应收收入金额（按日期范围）
     *
     * @param incomeDateStart 收入日期开始
     * @param incomeDateEnd 收入日期结束
     * @return 分组统计结果列表，包含 customerId 和 totalAmount
     */
    List<java.util.Map<String, Object>> groupByCustomerId(@Param("incomeDateStart") java.util.Date incomeDateStart,
                                                          @Param("incomeDateEnd") java.util.Date incomeDateEnd);
}
